﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SistemaDeBastanteodePoderes.Persistencia;
using NHibernate.Exceptions;
using SistemaDeBastanteodePoderes.Dominio;

namespace SistemaDeBastanteodePoderes.Negocio
{
    public class AbogadoServiceImpl : IAbogadoService
    {
        #region region de dependencias
        IRepresentanteDAO representanteDAO = null;
        ITipoDocumentoDAO tipoDocDAO = null;
        IClienteDAO clienteDAO = null;
        ITipoEmpresaDAO tipoEmpDAO = null;
        IBastanteoDAO bastanteoDAO = null;
        ITipoIntervencionDAO tipoIntDAO = null;
        IPoderDAO poderDAO = null;
        ITipoServicioDAO tipoSerDAO = null;
        #endregion

        #region operaciones de negocio
        public Representante InscribirRepresentante(int tipoDocCodigo, string NroDoc, string Nombres, string Apellidos, string Cargo, string GruBastanteo, int clienteCodigo)
        {

            //Excepcion si falta algun dato a crear
            if (tipoDocCodigo <= 0 || 
                NroDoc == null || NroDoc.Length == 0 ||
                Nombres == null || Nombres.Length == 0 ||
                Apellidos == null || Apellidos.Length == 0 ||
                Cargo == null || Cargo.Length == 0 ||
                GruBastanteo == null || GruBastanteo.Length == 0 ||
                clienteCodigo <= 0)
                throw new DatosInsuficientesException("Faltan datos para inscribir al representante");

            Representante representanteResult = null;
            Representante representanteACrear = new Representante();

            representanteACrear.TipDoc = tipoDocDAO.Obtener(tipoDocCodigo);

            representanteACrear.NroDoc = NroDoc;
            representanteACrear.Nombres = Nombres;
            representanteACrear.Apellidos = Apellidos;
            representanteACrear.Cargo = Cargo;
            representanteACrear.GruBastanteo = GruBastanteo;
            representanteACrear.Empresa = clienteDAO.Obtener(clienteCodigo);

            try
            {
                representanteResult = representanteDAO.Crear(representanteACrear);
            }
            catch (GenericADOException exNH)
            {
                throw new EntidadRepetidaException(exNH.InnerException.Message);
            }
            catch (Exception e)
            {
                throw new EntidadRepetidaException("Error desconocido", e);
            }

            return representanteResult;

        }
        public Bastanteo BastantearPoder(string Grupo, int poderCodigo, int tipoIntCodigo, string GruCombinacion, double ImpLimite, DateTime FecVencimiento, int clienteCodigo)
        {
            //Excepcion si falta algun dato
            if (Grupo == null || Grupo.Length == 0 ||
                poderCodigo <= 0 ||
                tipoIntCodigo <= 0 ||
                GruCombinacion == null || GruCombinacion.Length == 0 ||
                ImpLimite <= 0 ||
                FecVencimiento == null ||
                clienteCodigo <= 0
               )
                throw new DatosInsuficientesException("Faltan datos para bastantear al poder");

            Bastanteo bastanteoResult = null;
            Bastanteo bastanteoACrear = new Bastanteo();

            bastanteoACrear.Grupo = Grupo;
            bastanteoACrear.PoderAsignado = poderDAO.Obtener(poderCodigo);
            bastanteoACrear.Intervencion = tipoIntDAO.Obtener(tipoIntCodigo);
            bastanteoACrear.GruCombinacion = GruCombinacion;
            bastanteoACrear.ImpLimite = ImpLimite;
            bastanteoACrear.FecVencimiento = FecVencimiento;
            bastanteoACrear.Empresa = clienteDAO.Obtener(clienteCodigo);

            foreach (Bastanteo bastanteo in bastanteoACrear.Empresa.bastanteos)
                { 
                    if (bastanteo.Grupo == bastanteoACrear.Grupo &&
                        bastanteo.PoderAsignado.Codigo == bastanteoACrear.PoderAsignado.Codigo &&
                        bastanteo.Intervencion.Codigo == bastanteoACrear.Intervencion.Codigo &&
                        bastanteo.GruCombinacion == bastanteoACrear.GruCombinacion
                        )
                        throw new EntidadRepetidaException("Poder repetido para mismo cliente, en mismo grupo, tipo de intervencion y combinacion");
                }

            if (bastanteoACrear.Intervencion.Intervencion == "EN CONJUNTO CON" &&
                (bastanteoACrear.GruCombinacion == " "))
                throw new GrupoCombinacionException("Grupo de combinacion incorrecto - VACIO");

            if (bastanteoACrear.Intervencion.Intervencion == "A SOLA FIRMA" &&
                (bastanteoACrear.GruCombinacion != " "))
                throw new GrupoCombinacionException("No debe tener grupo de combinacion");
            
            try
            {
                bastanteoResult = bastanteoDAO.Crear(bastanteoACrear);
            }
            catch (GenericADOException exNH)
            {
                throw new EntidadRepetidaException(exNH.InnerException.Message);
            }
            catch (Exception e)
            {
                throw new EntidadRepetidaException("Error desconocido", e);
            }

            return bastanteoResult;
        }
        #endregion

        #region metodos de soporte para entidad representante
        public Representante ObtenerRepresentante(int codigo)
        {
            return representanteDAO.Obtener(codigo);
        }

        public ICollection<Representante> ListarRepresentantes()
        {
            return representanteDAO.ListarTodos();
        }
        #endregion

        #region metodos de soporte para tipo de documento
        public ICollection<TipoDocumento> ListarTiposDocumento()
        {
            return tipoDocDAO.ListarTodos();
        }
        #endregion

    }
}